import json
from itemadapter import ItemAdapter

# 当当网案例 【 Pipelines文件（保存数据）】
# 注意：在Pipelines文件中，我们对方法是进行重写，以下三个方法名和形参名不能更改

# 如果想使用管道，就必须在setting里开启 ITEM_PIPELINES 属性
class Pipelinedemo4DD:
    # 在爬虫执行完之前，执行的方法
    def open_spider(self, spider):
        """ 初始化文件资源 """

        # 追加模式写入文件，确保不会覆盖已有内容       
        self.fp = open('./logs/DangdangBook.json', 'a', encoding='utf-8')
        spider.logger.info(f"日志文件已创建：{self.fp.name}")

    # items就是yield后面的book对象
    def process_item(self, item, spider):
        """ 处理数据写入 """

        try:
            # 将item转为JSON字符串
            line = json.dumps(ItemAdapter(item).asdict(), ensure_ascii=False) + "\n"
            self.fp.write(line)   # 正确调用文件对象的write方法
            self.fp.flush()       # 立即写入防止数据丢失
        except Exception as ex:
            spider.logger.error(f"写入失败：{str(ex)}")
        
        # 必须返回item，否则会报错：TypeError: 'NoneType' object is not iterable
        return item

    # 在爬虫执行完之后，执行的方法
    def close_spider(self, spider):
        """ 关闭文件资源 """

        if hasattr(self, 'file'):
            self.fp.close()
            spider.logger.info("日志文件已关闭")
        # self.fp.close()


